import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

//字面意思回环栅栏，通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环
//是因为当所有等待线程都被释放以后，CyclicBarrier 可以被重用。我们暂且把这个状态就叫做
//barrier，当调用 await()方法之后，线程就处于 barrier 了。
public class CyclicBarrierDemo {

    public static void main(String[] args) {
        int n = 4;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(n);
        for (int i = 0; i < 4; i++) {
            new Writer(cyclicBarrier).start();
        }
        System.out.println("主线程执行结束");
    }

    static class Writer extends Thread{
        private CyclicBarrier cyclicBarrier;

        public Writer(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(5000);
                System.out.println("线程:"+Thread.currentThread().getName()+"写入数据完成，等待其他线程写入完成......"+cyclicBarrier.getNumberWaiting()+"****"+cyclicBarrier.getParties()+"****"+cyclicBarrier.isBroken());
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println("所有线程写入完毕，继续处理其他任务，比如数据操作");
        }
    }
}
